"""
定时任务执行模块
"""
from celery import shared_task
from django.utils import timezone
from datetime import datetime, timedelta
import pytz
import logging

from .models import ScheduledTask, TaskExecutionLog

logger = logging.getLogger(__name__)


@shared_task
def execute_scheduled_task(task_id, log_id):
    """执行定时任务"""
    try:
        task = ScheduledTask.objects.get(id=task_id)
        log = TaskExecutionLog.objects.get(id=log_id)
        
        # 更新任务状态
        task.status = 'running'
        task.save()
        
        # 执行具体的任务逻辑
        result = perform_task_action(task)
        
        # 更新执行日志
        log.status = 'success'
        log.finished_at = timezone.now()
        log.result = result
        log.save()
        
        # 更新任务统计
        task.success_count += 1
        task.status = 'active'
        task.last_run = timezone.now()
        # 计算下次执行时间（8小时后）
        task.next_run = timezone.now() + timedelta(hours=8)
        task.save()
        
        logger.info(f"任务 {task.name} 执行成功")
        
    except Exception as e:
        # 记录错误
        try:
            log = TaskExecutionLog.objects.get(id=log_id)
            log.status = 'error'
            log.finished_at = timezone.now()
            log.error_message = str(e)
            log.save()
            
            task = ScheduledTask.objects.get(id=task_id)
            task.error_count += 1
            task.status = 'error'
            task.last_error = str(e)
            task.save()
            
        except:
            pass
        
        logger.error(f"任务执行失败: {str(e)}")
        raise


def perform_task_action(task):
    """执行具体的任务动作"""
    if task.task_type == 'amazon_data':
        return download_amazon_data(task)
    elif task.task_type == 'ebay_data':
        return download_ebay_data(task)
    elif task.task_type == 'walmart_data':
        return download_walmart_data(task)
    elif task.task_type == 'price_monitor':
        return monitor_prices(task)
    elif task.task_type == 'rank_monitor':
        return monitor_ranks(task)
    else:
        raise ValueError(f"未知的任务类型: {task.task_type}")


def download_amazon_data(task):
    """下载亚马逊数据"""
    # 这里调用你现有的亚马逊数据下载逻辑
    # 例如：调用你的 fetch_amazon_data 方法
    
    # 模拟下载过程
    result = f"亚马逊数据下载完成 - 任务ID: {task.id}"
    logger.info(result)
    
    return result


def download_ebay_data(task):
    """下载eBay数据"""
    # 这里调用你现有的eBay数据下载逻辑
    result = f"eBay数据下载完成 - 任务ID: {task.id}"
    print(result)
    logger.info(result)
    
    return result


def download_walmart_data(task):
    """下载沃尔玛数据"""
    # 这里调用你现有的沃尔玛数据下载逻辑
    result = f"沃尔玛数据下载完成 - 任务ID: {task.id}"
    logger.info(result)
    
    return result


def monitor_prices(task):
    """监控价格变化"""
    # 这里调用你现有的价格监控逻辑
    result = f"价格监控完成 - 任务ID: {task.id}"
    logger.info(result)
    
    return result


def monitor_ranks(task):
    """监控排名变化"""
    # 这里调用你现有的排名监控逻辑
    result = f"排名监控完成 - 任务ID: {task.id}"
    logger.info(result)
    
    return result


@shared_task
def check_scheduled_tasks():
    """检查并执行到期的定时任务"""
    now = timezone.now()
    
    # 查找需要执行的任务
    tasks_to_run = ScheduledTask.objects.filter(
        status='active',
        next_run__lte=now
    )
    
    for task in tasks_to_run:
        try:
            # 创建执行日志
            log = TaskExecutionLog.objects.create(
                task=task,
                status='running'
            )
            
            # 异步执行任务
            execute_scheduled_task.delay(task.id, log.id)
            
            # 更新下次执行时间（8小时后）
            task.next_run = timezone.now() + timedelta(hours=8)
            task.save()
            
            logger.info(f"调度任务 {task.name} 已加入执行队列，下次执行时间: {task.next_run}")
            
        except Exception as e:
            logger.error(f"调度任务 {task.name} 执行失败: {str(e)}")
            task.status = 'error'
            task.last_error = str(e)
            task.save()


# 如果你想要集成现有的数据下载功能，可以在这里添加具体的实现
# 例如，集成你现有的亚马逊数据下载方法：

def download_amazon_data_with_existing_logic(task):
    """使用现有的亚马逊数据下载逻辑"""
    try:
        # 这里可以调用你现有的数据下载方法
        # 例如：
        # from .admin import asinsupload_xueAdmin
        # admin_instance = asinsupload_xueAdmin()
        # result = admin_instance.fetch_amazon_data_logic()
        
        # 或者直接调用你的数据下载函数
        # result = your_existing_amazon_download_function()
        
        result = f"亚马逊数据下载完成 - 任务ID: {task.id}"
        logger.info(result)
        
        return result
        
    except Exception as e:
        logger.error(f"亚马逊数据下载失败: {str(e)}")
        raise


def download_ebay_data_with_existing_logic(task):
    """使用现有的eBay数据下载逻辑"""
    try:
        # 集成你现有的eBay数据下载逻辑
        result = f"eBay数据下载完成 - 任务ID: {task.id}"
        logger.info(result)
        
        return result
        
    except Exception as e:
        logger.error(f"eBay数据下载失败: {str(e)}")
        raise


def download_walmart_data_with_existing_logic(task):
    """使用现有的沃尔玛数据下载逻辑"""
    try:
        # 集成你现有的沃尔玛数据下载逻辑
        result = f"沃尔玛数据下载完成 - 任务ID: {task.id}"
        logger.info(result)
        
        return result
        
    except Exception as e:
        logger.error(f"沃尔玛数据下载失败: {str(e)}")
        raise